<?php
/**
 * @link https://www.kancloud.cn/cleverstone/ymb2
 * @copyright Copyright (c) 2020 Yii Manager Software LLC
 */

use builder\helper\H5;
use yii\helpers\Json;
use builder\helper\Url;
use builder\helper\App;

/* ====== 表格构建器 ====== */

/** @var \yii\web\View $this */
/* @var string $id 当前表格组件ID */
/* @var string $url 当前表格URL */
/* @var boolean $page 是否分页 */
/* @var boolean $pageSample 是否是简略分页模版 */
/* @var string $className 给表格主容器追加 css 类名，以便更好地扩展表格样式 */
/* @var array $css 给当前表格主容器直接设定 css 样式 */
/* @var string $cellExpandedMode 设置所有单元格默认展开方式 */
/* @var int $width 表格宽度 */
/* @var string|int $height 表格高度 */
/* @var int $maxHeight 表格最大高度(设置后表格height失效) */
/* @var array $tableHead 表格头部 */
/* @var string $title 表格标题 */
/* @var string $limits 每页数据条数选项 */
/* @var integer $limit 每页数据条数 */
/* @var bool $autoSort 是否由组件自动进行前端排序。若为 false，则需自主排序，即由后端直接返回排序好的数据。 */
/* @var string $skin 皮肤 */
/* @var string $size 尺寸 */
/* @var bool $even 开启间隔行样式 */
/* @var bool $columnFilter 是否展示列筛选 */
/* @var bool $toolbarPrint 是否展示工具打印 */
/* @var bool $toolbarExports 是否展示工具导出 */
/* @var bool $toolbarRefresh 是否展示窗口刷新工具项 */
/* @var string $lineStyle 开启设置表格多行样式 */
/* @var integer $cellMinWidth 设置所有普通单元格的最小宽度，一般用于列宽自动分配的情况。其优先级低于表头属性中的 minWidth */
/* @var integer $cellMaxWidth 设置所有普通单元格的最大宽度。其优先级低于表头属性中的 maxWidth */
/* @var boolean $openTotalRow 是否开启行合计 */
/* @var array $rowOperation 行操作项 */
/* @var array $cellOperation 单元格操作项 */
/* @var array $toolbarCustom 自定义头部工具栏(分组) ['left' => [...], 'right' => [...]] */
/* @var array $toolbarCustomRaw 自定义头部工具栏 */
/* @var array $toolbarFilter 表格筛选 */
/* @var boolean $autoRequest 是否自动发起数据请求 */
/* @var array $extraJs 额外的JS脚本 */
/* @var array $toolbarTabDefault 工具选项卡默认请求参数 */
?>
<script>
    -function (global, top) { "use strict";
        global.ym2App.controller("ym2.ctrl.<?= $id ?>", [
            "$scope",
            "$http",
            "$timeout",
            "ymSpinner",
            "layui",
            "ym2",
            "swal",
            "lodash",
            "$compile",
            "jQuery",
            function ($scope, $http, $timeout, ymSpinner, layui, ym2, swal, lodash, $compile, jQuery) {
                /*** ======================================== 表格内容构建 ======================================== ***/
                var compoID = "<?= $id ?>";
                var tableFilterDisplayScopeProp = "ym2TableFilterControlUnspread_<?= $id ?>";
                var topSwal = top.swal;
                var topToastr = top.toastr;
                var topLayer = top.layui.layer;
                var topJquery = top.jQuery;
                var topYmSpinner = top.ymSpinner;
                var table = layui.table;
                var layForm = layui.form;
                var dropdown = layui.dropdown;
                var historyWhere = {};
                var fixedWhere = {};
                var fixedWhere_toolbar_tag = <?= !empty($toolbarTabDefault) ? Json::encode($toolbarTabDefault) : '{}' ?>;
                var sortWhere = {};
                var table_title_help_tpl = function ($content) {
                    return '<i style="cursor: help;" class="layui-icon layui-icon-tips f13 pl-1 font-weight-light" data-toggle="popover"\
                               data-trigger="hover"\
                               data-custom-class="f13 white-space-pre-wrap pointer-event-none"\
                               data-html="true"\
                               data-content="' + $content + '"\
                               ym2-bootstrap-plugin="popover"></i>';
                };
                var HTTP_SUCCESS_CODE = <?= App::params('http.res.success') ?>;
                var HTTP_FAILURE_CODE = <?= App::params('http.res.failure') ?>;
                var HTTP_UNAUTHORITY_CODE = <?= App::params('http.res.unauthorized') ?>;
                var ADMIN_LOGIN_URL = '<?= Url::to(App::params('admin.route.login'), '') ?>';
                var dialog_dump_login_page = function (msg) {
                    ym2.swal.timer(
                        topSwal,
                        msg,
                        "自动跳转; <a href='"+ADMIN_LOGIN_URL+"' target='_top'>立即跳转<a/>",
                        function () {
                            top.open(ADMIN_LOGIN_URL, "_self");
                        },
                        3000
                    );
                };

                var cols = [
<?php foreach ($tableHead as $options): ?>
<?php switch ($options['type']): case '__checkbox': ?>
                    // 行多选框
                    {
                        type: "checkbox",
<?php if (!empty($options['fixed'])): ?>
                        fixed:"<?= $options['fixed'] ?>",
<?php endif; ?>
                        // 样式
                        style: "<?= $options['style'] ?>",
                    },
<?php break; case '__radio': ?>
                    //行单选
                    {
                        type: "radio",
                        title: "<?= $options['title'] ?>",
<?php if (!empty($options['fixed'])): ?>
                        fixed:"<?= $options['fixed'] ?>",
<?php endif; ?>
<?php if ($options['width']): ?>
                        // 当前列宽度
                        width: <?= is_numeric($options['width']) ? $options['width'] : "'{$options['width']}'" ?>,
<?php endif; ?>
                        // 样式
                        style: "<?= $options['style'] ?>",
                    },
<?php break; case '__number': ?>
                    //序号列
                    {
                        type: "numbers",
                        title: "<?= $options['title'] ?>",
<?php if (!empty($options['fixed'])): ?>
                        fixed:"<?= $options['fixed'] ?>",
<?php endif; ?>
<?php if ($options['width']): ?>
                        // 当前列宽度
                        width: <?= is_numeric($options['width']) ? $options['width'] : "'{$options['width']}'" ?>,
<?php endif; ?>
                        // 样式
                        style: "<?= $options['style'] ?>",
                    },
<?php break; case '__toolbar': ?>
                    // 行工具栏
                    {
                        //标题
                        title: "<?= $options['title'] ?>",
<?php if (!empty($options['fixed'])): ?>
                        //固定列
                        fixed: "<?= $options['fixed'] ?>",
<?php endif; ?>
<?php if (!empty($options['width'])): ?>
                        // 当前列宽度
                        width: <?= is_numeric($options['width']) ? $options['width'] : "'{$options['width']}'" ?>,
<?php endif; ?>
                        minWidth: "<?= $options['minWidth'] ?>",
<?php if ($options['maxWidth']): ?>
                        // 当前列的最大宽度
                        maxWidth: "<?= $options['maxWidth'] ?>",
<?php endif; ?>
                        align: "<?= $options['align'] ?>",
                        // 样式
                        style: "<?= $options['style'] ?>",
                        toolbar:"#ym2_tool_<?= $id ?>",
                    },
<?php break; case '__field': ?>
                    // 行字段
                    {
<?php if (!empty($options['field'])): ?>
                        // 字段
                        field: "<?= $options['field'] ?>",
<?php endif; ?>
                        // 标题
                        title: <?= !empty($options['help']) ? ("'{$options['title']}'" . ' + table_title_help_tpl("' . $options['help'] . '")') : "'{$options['title']}'" ?>,

                        // 设置列的字段标题。该属性在筛选列和导出场景中优先级高于 title 属性
                        fieldTitle: "<?= $options['title'] ?>",
<?php if (!empty($options['field'])): ?>
                        // 模板
                        templet: function (col) {
                            return col["<?= $options['field'] ?>"];
                        },
<?php endif; ?>
<?php if (!empty($options['edit'])): ?>
                        // 编辑事件
                        edit: function (d) {
                            var ctrlField = "<?= $options['ctrlField'] ?>";
                            if(!ctrlField.length || d[ctrlField]){
                                return "<?= $options['edit'] ?>";
                            }
                        },
<?php endif; ?>
                        // 是否开启列的排序功能。
                        sort: <?= $options['sort'] ?>,
                        // 单元格排列方式。可选值有：left | center | right
                        align: "<?= $options['align'] ?>",
<?php if (!empty($options['width'])): ?>
                        // 当前列宽度
                        width: <?= is_numeric($options['width']) ? $options['width'] : "'{$options['width']}'" ?>,
<?php endif; ?>
                        // 最小宽度
                        minWidth: "<?= $options['minWidth'] ?>",
                        // 样式
                        style: "<?= $options['style'] ?>",
                        // 当前列的最大宽度
<?php if ($options['maxWidth']): ?>
                        maxWidth: "<?= $options['maxWidth'] ?>",
<?php endif; ?>
<?php if ($options['totalRow']): ?>
                        // 前端行合计
                        totalRow: true,
<?php endif; ?>
                    },
<?php break; case '__switch': ?>
                    // 行开关
                    {
                        // 字段
                        field: "<?= $options['field'] ?>",
                        // 标题
                        title: <?= !empty($options['help']) ? ("'{$options['title']}'" . ' + table_title_help_tpl("' . $options['help'] . '")') : "'{$options['title']}'" ?>,
                        // 设置列的字段标题。该属性在筛选列和导出场景中优先级高于 title 属性
                        fieldTitle: "<?= $options['title'] ?>",
                        // 模板
                        templet: function (col) {
                            var layFilter = compoID + "_switch";
                            var disabled = "";
<?php if (!empty($options['ctrlField'])): ?>
                            disabled = col[ "<?= $options['ctrlField'] ?>" ] ? " disabled" : "";
<?php endif; ?>
                            var valueStringify = layui.util.escape( JSON.stringify( ym2.fillParams( <?= Json::encode($options['params']) ?>, col ) ) );
                            var checkedAttr = Number(col["<?= $options['field'] ?>"]) ? ' checked' : '';

                            return '<input type="checkbox" title="<?= $options['label'] ?>" name="<?= $options['field'] ?>" value="' + valueStringify + '" lay-skin="switch" lay-filter="' + layFilter + '"' + checkedAttr + disabled + '>'
                        },
                        // 单元格排列方式。可选值有：left | center | right
                        align: "<?= $options['align'] ?>",
<?php if (!empty($options['width'])): ?>
                        // 当前列宽度
                        width: <?= is_numeric($options['width']) ? $options['width'] : "'{$options['width']}'" ?>,
<?php endif; ?>
                        // 最小宽度
                        minWidth: "<?= $options['minWidth'] ?>",
                        // 样式
                        style: "<?= $options['style'] ?>",
<?php if ($options['maxWidth']): ?>
                        // 当前列的最大宽度
                        maxWidth: "<?= $options['maxWidth'] ?>",
<?php endif; ?>

                    },

<?php break; endswitch; ?>
<?php endforeach; ?>

                ];
                var isEnsureFixbar = false;
                var tableOptions = {
                    id: "<?= 'ym2_' . $id ?>",
                    elem: "#ym2_builder_<?= $id ?>",
                    css: [
<?php if ($pageSample): ?>
                        '.layui-table-page .layui-hide-v {visibility: initial !important}',
<?php endif; ?>
<?php foreach ($css as $item): ?>
                        `<?= $item ?>`,
<?php endforeach; ?>
                    ].join(''),
                    url: "<?= $url ?>",
                    height: <?= is_numeric($height) ? $height : "$height" ?>,
                    title: "<?= H5::encode($title) ?>",
                    limits: <?= $limits ?>,
                    limit: <?= $limit ?>,
                    cellExpandedMode: "<?= $cellExpandedMode ?>",
                    editTrigger: "click",
                    autoSort: <?= $autoSort ? 'true' : 'false' ?>,
                    // ui-spin-sm: 小 ui-spin-md:中 ui-spin-lg:大
                    loading: '<div class="ui-spindot">\
                                <div class="ui-spin ui-spin-spinning ui-spin-md">\
                                    <span class="ui-spin-dot ui-spin-dot-spin">\
                                        <i class="ui-spin-dot-item"></i>\
                                        <i class="ui-spin-dot-item"></i>\
                                        <i class="ui-spin-dot-item"></i>\
                                        <i class="ui-spin-dot-item"></i>\
                                    </span>\
                                </div>\
                               </div>',
                    skin: "<?= !empty($skin) ? $skin : "line" ?>",
                    size: "<?= !empty($size) ? $size : "md" ?>",
                    even: <?= !empty($even) ? 'true' : 'false' ?>,
                    cols: [
                        cols,
                    ],
                    response: {
                        statusCode: HTTP_SUCCESS_CODE,
                    },
                    parseData: function(result){
                        return {
                            code: result.code,
                            msg: result.msg,
                            count: result.data.count,
                            data: result.data.list,
                            // 后端行合计
                            totalRow: result.data.totalRow,
                            // 额外数据
                            extraData: result.data.extraData,
                        };
                    },
                    done: function(res, curr, count){
                        //console.log(res); // 得到当前渲染的数据
                        //console.log(curr);  // 得到当前页码
                        //console.log(count); // 得到数据总量
                        if (res.extraData) {
                            $scope.$apply(function () {
                                $scope.__extraData = res.extraData;
                            });
                        }

                        //layui 数据表格进行 AngularJs 动态编译
                        $compile( this.elem.next() )( $scope );

                        // 置顶图标
                        if (!isEnsureFixbar) {
                            layui.util.fixbar({
                                target: this.elem.next().find(".layui-table-main"),
                            });

                            isEnsureFixbar = true;
                        }
                    },
                };
                //是否分页
<?php if ($page): ?>
                tableOptions.page = !!<?= (int)$pageSample ?> ? {//简略分页模版
                    layout: ['refresh', 'prev', 'page', 'next', 'skip', 'limit'], //自定义分页布局
                    curr: 1,
                    groups: 0,//只显示0个连续页码
                    first: false,
                    last: false
                } : true;
<?php else: ?>
                tableOptions.page = false;
<?php endif; ?>
                // 表格最大高度
<?php if ($maxHeight): ?>
                tableOptions.maxHeight = <?= $maxHeight ?>;
<?php endif; ?>
                // 头部左侧工具栏
<?php if (!empty($toolbarCustom['left'])): ?>
                tableOptions.toolbar = "#ym2_toolbar_<?= $id ?>";
<?php elseif(
    !empty($toolbarCustom['right'])  // 工具栏右侧自定义不为空
    || !empty($toolbarFilter) // 表格筛选工具项存在
    || $columnFilter  // 列筛选工具项存在
    || $toolbarExports  // 工具导出存在
    || $toolbarPrint  // 工具打印存在
    || $toolbarRefresh // 工具刷新存在
): ?>
                tableOptions.toolbar = true;
<?php endif; ?>
<?php if (!empty($toolbarCustom['bottom'])): ?>
                tableOptions.pagebar = "#ym2-pagebar_<?= $id ?>"; // 分页栏自定义操作
<?php endif; ?>
<?php if ($openTotalRow): ?>
                // 是否开启行合计
                tableOptions.totalRow = true;
<?php endif; ?>
<?php if ($className): ?>
                // 给表格主容器追加 css 类名，以便更好地扩展表格样式
                tableOptions.className = "<?= $className ?>";
<?php endif; ?>
<?php if($cellMinWidth): ?>
                // 设置所有普通单元格的最小宽度，一般用于列宽自动分配的情况。其优先级低于表头属性中的 minWidth
                tableOptions.cellMinWidth = <?= $cellMinWidth ?>;
<?php endif; ?>
<?php if($cellMaxWidth): ?>
                // 设置所有普通单元格的最大宽度。其优先级低于表头属性中的 maxWidth
                tableOptions.cellMaxWidth = <?= $cellMaxWidth ?>;
<?php endif; ?>
<?php if (!empty($lineStyle)): ?>
                // 表格多行样式, 如高度
                tableOptions.lineStyle = "<?= $lineStyle ?>";
<?php endif; ?>
                tableOptions.defaultToolbar = [];
<?php if (!empty($toolbarCustom['right'])): ?>
<?php foreach ($toolbarCustom['right'] as $item): ?>
                // 工具栏右侧自定义
                tableOptions.defaultToolbar.push({
                    title: "<?= $item['title'] ?>",
                    layEvent: "<?= $item['options']['__event_id'] ?>",
                    icon: "<?= !empty($item['icon']) ? $item['icon'] : 'bi bi-heart' ?>",
                });
<?php endforeach; ?>
<?php endif; ?>
<?php if($columnFilter): ?>
                // 列筛选
                tableOptions.defaultToolbar.push("filter");
<?php endif; ?>
<?php if($toolbarExports): ?>
                // 工具导出
                tableOptions.defaultToolbar.push("exports");
<?php endif; ?>

<?php if($toolbarPrint): ?>
                // 工具打印
                tableOptions.defaultToolbar.push("print");
<?php endif; ?>
<?php if (!empty($toolbarFilter)): ?>
                // 表格筛选项
                tableOptions.defaultToolbar.push({
                    title:"<?= $toolbarFilter['title'] ?>",
                    layEvent: "ym2_table_event_filter",
                    icon: "<?= $toolbarFilter['icon'] ?>",
                });
<?php endif; ?>
<?php if($toolbarRefresh): ?>
                // 工具窗口刷新
                tableOptions.defaultToolbar.push({
                    title: "刷新窗口",
                    layEvent: "ym2_table_event_refresh",
                    icon: "bi bi-arrow-clockwise",
                });
<?php endif; ?>
                // 表格宽度
                var tableWidth = "<?= $width ?>";
                if (tableWidth) {
                    tableOptions.width = tableWidth;
                }

                // 表格数据重载
                function reloadTable(where, initPage, extraOptions, fullReload) {
                    where = where || historyWhere || {};
                    initPage = initPage || false;
                    extraOptions = extraOptions || {};
                    fullReload = fullReload || false;
                    historyWhere = where;
                    // 表格选项
                    var options = {
                        where: Object.assign({}, where, fixedWhere, fixedWhere_toolbar_tag, sortWhere),
                        scrollPos: "fixed",
                    };

                    // 初始化页码
                    if (initPage && tableOptions.page) {
                        options.page = !!<?= (int)$pageSample ?> ? {//简略分页模版
                            layout: ['refresh', 'prev', 'page', 'next', 'skip', 'limit'], //自定义分页布局
                            curr: 1,
                            groups: 0,
                            first: false, //不显示首页
                            last: false //不显示尾页
                        } : {
                            curr: 1,
                        };
                    }

                    Object.assign(options, extraOptions);
                    fullReload ? table.reload(tableOptions.id, options) : table.reloadData(tableOptions.id, options);
                }

                /*** ======================================== 表格事件-列排序 ======================================== ***/
                // 触发排序事件
                table.on("sort(" + tableOptions.id + ")", function(obj) {
                    //console.log(obj.field); // 当前排序的字段名
                    //console.log(obj.type); // 当前排序类型：desc（降序）、asc（升序）、null（空对象，默认排序）
                    //console.log(this); // 当前排序的 th 对象
                    sortWhere = obj.type ? {__S_FIELD: obj.field, __S_ORDER: obj.type} : {};
                    reloadTable(false, false, {
                        initSort: obj // 记录初始排序，如果不设的话，将无法标记表头的排序状态。
                    }, true);
                });

                /*** ======================================== 表格事件-行操作 ======================================== ***/
                // ***单元格文本(域)编辑事件 start ***
<?php if (!empty($cellOperation['edit'])): ?>
                table.on("edit(" + tableOptions.id + ")", function(obj){
                    var field = obj.field; // 得到修改的字段
                    var rowData = obj.data; // 得到所在行所有键值
                    var value = obj.value; // 得到修改后的值
                    //var col = obj.getCol(); // 得到当前列的表头配置属性 -- v2.8.0 新增
                    var params;
                    var route;

                    switch (field) {
<?php foreach ($cellOperation['edit'] as $item): ?>
                        case "<?= $item['field'] ?>":
                            params = ym2.fillParams(<?= Json::encode($item['params']) ?>, rowData);
                            route = "<?= $item['route'] ?>";
                            break;
<?php endforeach; ?>
                    }

                    if (!route || !params) {
                        global.console.warn('route: ', route, 'params: ', params);
                        ym2.swal.fail(topSwal, "单元格编辑[route]或[params]参数缺失!");
                        return;
                    }

                    var url = ym2.addUrlQueryParam(route, params);
                    var bodyParam = {};
                    bodyParam[field] = value;
                    // show loading
                    var flag = ymSpinner.show();
                    $http.post(url, bodyParam).then(function (result) {
                        ymSpinner.hide(flag);

                        var data = result.data;
                        switch (data.code) {
                            case HTTP_SUCCESS_CODE:
                                // reload list
                                $timeout(function () {
                                    reloadTable();
                                }, 150);

                                break;
                            case HTTP_FAILURE_CODE:
                                ym2.swal.fail(topSwal, data.msg);

                                break;
                            case HTTP_UNAUTHORITY_CODE:
                                dialog_dump_login_page(data.msg);

                                break;
                            default:
                                ym2.swal.fail(topSwal, data.msg);
                        }

                    }, function (error) {
                        ymSpinner.hide(flag);
                        global.console.error(error);

                        var errMsg = error.data || "系统错误，发起请求失败!";
                        if (error.status === 403) {
                            dialog_dump_login_page(errMsg);
                        } else {
                            ym2.swal.fail(topSwal, errMsg);
                        }

                    });
                });
<?php endif; ?>
                // ***单元格文本(域)编辑事件 end ***

                // ***单元格开关操作 start***
<?php if (!empty($cellOperation['switch'])): ?>
                layForm.on("switch(" + compoID + "_switch)", function (obj) {
                    //请求参数
                    var queryParams = JSON.parse( obj.value );
                    //选中状态
                    var checkedStatus = obj.elem.checked;
                    //字段名
                    var fieldName = obj.elem.name;
                    //后台接口
                    var route;
                    //操作失败，还原选中状态
                    var render_fail_func = function () {
                        obj.elem.checked = !checkedStatus;
                        layForm.render( layui.$( obj.elem ) );
                    };

                    switch (fieldName) {
<?php foreach ($cellOperation['switch'] as $item): ?>
                        case "<?= $item['field'] ?>":
                            route = "<?= $item['route'] ?>";
                            break;
<?php endforeach; ?>
                    }

                    if ( !route || !queryParams ) {
                        global.console.warn('route: ', route, 'params: ', queryParams);
                        ym2.swal.fail(topSwal, "单元格操作[route]或[params]参数缺失!");
                        return;
                    }

                    var url = ym2.addUrlQueryParam( route, queryParams );
                    var bodyParam = {};
                    bodyParam[fieldName] = +checkedStatus;
                    // show loading
                    var flag = ymSpinner.show();
                    $http.post(url, bodyParam).then(function (result) {
                        ymSpinner.hide(flag);

                        var data = result.data;
                        switch (data.code) {
                            case HTTP_SUCCESS_CODE://成功
                                //重载表格
                                $timeout(function () {
                                    reloadTable();
                                }, 150);

                                break;
                            case HTTP_FAILURE_CODE://失败
                                render_fail_func();
                                ym2.swal.fail(topSwal, data.msg);

                                break;
                            case HTTP_UNAUTHORITY_CODE://授权失效
                                render_fail_func();
                                // 授权失效, 去登录
                                dialog_dump_login_page(data.msg);

                                break;
                            default:
                                render_fail_func();
                                ym2.swal.fail(topSwal, data.msg);
                        }

                    }, function (error) {
                        render_fail_func();
                        ymSpinner.hide(flag);
                        ym2.swal.fail(topSwal, error.data || "系统错误,发起请求失败!");
                        global.console.error(error);
                    });

                });
<?php endif; ?>
                // ***单元格开关操作 end***

                // **** 行操作事件 start ****
<?php if (!empty($rowOperation)): ?>
                table.on("tool(" + tableOptions.id + ")", function (obj) {
                    var event = obj.event;
                    var configs;
                    switch (event) {
<?php if (!empty($rowOperation['normal'])): ?>
<?php foreach ($rowOperation['normal'] as $item): ?>

                        case "<?= $item['options']['__event_id'] ?>":
                            configs = <?= Json::encode($item['options']) ?>;
                            rowEventCall("<?= $item['type'] ?>", configs, obj);
                            break;
<?php endforeach; ?>
<?php endif; ?>
                        case "ym2_row_event_group_more": // 分组更多
<?php if (!empty($rowOperation['more'])): ?>

                            // 行数据, 一维JSON
                            var rowData = obj.data || {};
                            // 动态添加操作
                            var dropdownTempData = [
<?php foreach ($rowOperation['more'] as $item): ?>
                                {
                                    title: `<?= $item['options']['title'] ?> `,
                                    id: "<?= $item['options']['__event_id'] ?>",
                                    templet: function (d) {
                                        return '<i class="<?= $item["options"]["icon"] ?>"></i>&nbsp;' + d.title;
                                    },
                                    php_configs: <?= Json::encode($item['options']) ?>,
                                    php_type: "<?= $item['type'] ?>",
                                },
<?php endforeach; ?>
                            ];
                            var dropdownData = [];
                            dropdownTempData.forEach(function (value, index, array) {
                                var operationId = value.php_configs.operationId;
                                if (ym2.typeOf(operationId) !== 'string' || (operationId.length && rowData[operationId])) {
                                    dropdownData.push(value);
                                }
                            });

                            if (dropdownData.length) { // 存在下拉菜单配置项
                                dropdown.render({
                                    // 触发事件的 DOM 对象
                                    elem: this,
                                    trigger: "click",
                                    // 外部事件触发即显示
                                    show: true,
                                    data: dropdownData,
                                    click: function(data){
                                        rowEventCall(data.php_type, data.php_configs, obj);
                                    },
                                    align: "left", // 右对齐弹出
                                    style: "box-shadow: 1px 1px 10px rgb(0 0 0 / 12%);", // 设置额外样式
                                });
                            } else { // 暂无菜单提示
                                topToastr.info("暂无更多操作!");
                            }
<?php endif; ?>
                            break;
                    }

                });
<?php endif; ?>
                // **** 行操作事件 end ****

                /**
                 * 行操作 - 事件调用
                 * @param type 调用类型: modal, ajax, page
                 * @param configs 选项, 查看构建器$rowOperation
                 * @param obj 行对象
                 */
                function rowEventCall(type, configs, obj) {
                    switch (type) {
                        case 'modal':
                            rowModalCall(configs, obj);
                            break;
                        case 'ajax':
                            rowAjaxCall(configs, obj);
                            break;
                        case 'page':
                            rowPageCall(configs, obj);
                            break;
                    }
                }

                /**
                 * 行操作 - modal调用
                 * @param configs 选项, 查看构建器$rowOperation
                 * @param obj 行对象
                 */
                function rowModalCall(configs, obj) {
                    // 行数据, 一维JSON
                    var rowData = obj.data || {};
                    // title
                    var title = configs.modalTitle;
                    // URL参数
                    var params = ym2.fillParams(configs.params || [], rowData);
                    // URL
                    var url = configs.route;
                    // modal width
                    var width = configs.width;
                    // modal height
                    var height = configs.height;
                    // modal footer close btn
                    var footerCloseBtn = configs.closeBtn;
                    // layer screen obj
                    var layerScreenObj = ym2.layerScreenOptions(width);
                    var refererName = ym2.layerRefererWindowName( configs.refererWindow );

                    // layer动态唯一索引
                    var activeIndex = topLayer.index;
                    // iframe 模态框
                    // var loadingFlag = topYmSpinner.show("加载中...");
                    var layerCf = {
                        type: 2, // iframe
                        //skin: 'layui-layer-win10',
                        area: [layerScreenObj.width, height],
                        title: title,
                        shade: 0.3, // 遮罩透明度
                        shadeClose: false, // 点击遮罩区域，关闭弹层
                        closeBtn: configs.titleCloseBtn,
                        maxmin: configs.titleMaxminBtn, // 允许全屏最小化
                        anim: 0, // 0-6 的动画形式，-1 不开启
                        scrollbar: false, // 打开弹层时，是否允许浏览器出现滚动条。
                        content: ym2.addUrlQueryParam(url, params),
                        success: function(layero, index, that){
                            // topYmSpinner.hide( loadingFlag );
                            // 弹层的最外层元素的 jQuery 对象
                            //console.log(layero);
                            // 弹层的索引值
                            //console.log(index);
                            // 弹层内部原型链中的 this --- 2.8+
                            //console.log(that);
                            // 获取iframe的窗口对象, 添加来源追踪
                            var iframeWin = top[layero.find("iframe")[0]["name"]];
                            iframeWin.__REFERER_WIN_NAME = refererName;
                            //键盘事件关闭
                            topJquery(".ym2_kc_" + activeIndex).focus().on("keydown", function (e) {
                                // 空格和回车键
                                if (e.keyCode === 13 || e.keyCode === 32) {
                                    topJquery(this).trigger("click");
                                }
                            });
                        },
                    };

                    if (footerCloseBtn) {
                        layerCf.btn = ['<span class="ym2_keydown_close ym2_kc_' + activeIndex + '" tabindex="0">关闭</span>'];
                    }

                    topLayer.open(layerCf);
                }

                /**
                 * 行操作 - page调用
                 * @param configs 选项, 查看构建器$rowOperation
                 * @param obj 行对象
                 */
                function rowPageCall(configs, obj) {
                    // 行数据, 一维JSON
                    var rowData = obj.data || {};
                    // URL参数
                    var params = ym2.fillParams(configs.params || [], rowData);
                    // URL
                    var url = configs.route;
                    // target
                    var target = configs.target;
                    // href
                    var href = ym2.addUrlQueryParam(url, params);
                    // 打开
                    global.open(href, target);
                }

                /**
                 * 行操作 - ajax调用
                 * @param configs 选项, 查看构建器$rowOperation
                 * @param obj 行对象
                 */
                function rowAjaxCall(configs, obj) {
                    ym2.swal.question(topSwal, configs.questionTitle, configs.questionDescription, function (result) {
                        /* Read more about isConfirmed, isDenied below */
                        if (result.isConfirmed) {
                            // 发起ajax
                            rowAjaxRequest(configs, obj);
                        }
                    });
                }

                /**
                 * 行操作 - 发起ajax请求
                 * @param configs 选项, 查看构建器$rowOperation
                 * @param obj 行对象
                 */
                function rowAjaxRequest(configs, obj) {
                    // 行数据, 一维JSON
                    var rowData = obj.data || {};
                    // URL参数
                    var params = ym2.fillParams(configs.params || [], rowData);
                    // URL
                    var url = configs.route;
                    // HTTP method
                    var method = configs.method;
                    // url添加参数
                    url = ym2.addUrlQueryParam(url, params);

                    var instance;
                    if (method.toUpperCase() === "GET") {
                        instance = $http.get(url);
                    } else if (method.toUpperCase() === "POST") {
                        instance = $http.post(url, params);
                    }

                    // show loading
                    var flag = ymSpinner.show();
                    instance.then(function (result) {
                        ymSpinner.hide(flag);

                        var data = result.data;
                        switch (data.code) {
                            case HTTP_SUCCESS_CODE:
                                ym2.swal.ok(topSwal, data.msg);
                                // reload list
                                $timeout(function () {
                                    reloadTable();
                                }, 150);

                                break;
                            case HTTP_FAILURE_CODE:
                                ym2.swal.fail(topSwal, data.msg);

                                break;
                            case HTTP_UNAUTHORITY_CODE:
                                dialog_dump_login_page(data.msg);

                                break;
                            default:
                                ym2.swal.fail(topSwal, data.msg);
                        }

                    }, function (error) {
                        ymSpinner.hide(flag);
                        ym2.swal.fail(topSwal, error.data || "系统错误,发起请求失败!");
                        global.console.error(error);
                    });

                }

                /*** ======================================== 表格事件-工具栏 ======================================== ***/
                // 头部工具栏事件
                table.on("toolbar(" + tableOptions.id + ")", function (obj) {
                    var that = this;
                    var configs;
                    switch (obj.event) {
                        // 页面刷新
                        case "ym2_table_event_refresh":
                            refreshCurrentPage();
                            break;
                        // 表格筛选
                        case "ym2_table_event_filter":
                            tableFilterToggle();
                            break;
<?php foreach ($toolbarCustomRaw as $item): ?>
<?php if (in_array($item['position'], ['left', 'right'])): ?>
                        case "<?= $item['options']['__event_id'] ?>":
                            configs = <?= Json::encode($item) ?>;
                            headToolbarEventDispatch(configs, obj, that);
                            break;
<?php endif; ?>
<?php endforeach; ?>
                    }
                });

                // 尾部分页栏事件
                table.on("pagebar(" + tableOptions.id + ")", function(obj){
                    var that = this;
                    var configs;
                    switch (obj.event) {
<?php foreach ($toolbarCustomRaw as $item): ?>
<?php if ($item['position'] == 'bottom'): ?>
                        case "<?= $item['options']['__event_id'] ?>":
                            configs = <?= Json::encode($item) ?>;
                            headToolbarEventDispatch(configs, obj, that);
                            break;
<?php endif; ?>
<?php endforeach; ?>
                    }
                });

                /**
                 * 工具事件类型 - 分发
                 * @param configs 工具项配置
                 * @param obj 表格配置对象
                 * @param ele 当前DOM对象
                 */
                function headToolbarEventDispatch(configs, obj, ele) {
                    switch (configs.options.type) {
                        case "page": // 单页
                            headToolbarPageEvent(configs.options, obj);
                            break;
                        case "modal": // 模态框
                            headToolbarModalEvent(configs.options, obj);
                            break;
                        case "ajax": // AJAX
                            headToolbarAjaxEvent(configs.options, obj);
                            break;
                        case "dropdown": // 下拉菜单
                            headToolbarDropdownEvent(configs, obj, ele);
                            break;
                    }
                }

                /**
                 * 头部工具栏事件 - 表格筛选隐藏/展示
                 */
                var dynamicField = "ym2TableFilterShow_<?= $id ?>";
                var ym2TableStorage = layui.data('ym2_table');
                $scope[dynamicField] = ym2TableStorage[dynamicField] !== "hide";
                function tableFilterToggle() {
                    $scope.$apply(function () {
                        var isShowFilter = $scope[dynamicField];
                        $scope[dynamicField] = !isShowFilter;
                        layui.data("ym2_table", {
                            key: dynamicField,
                            value: !isShowFilter ? "show" : "hide",
                        });
                    });
                }

                /**
                 * 头部工具栏事件 - 刷新
                 */
                function refreshCurrentPage() {
                    global.location.reload(true);
                }

                /**
                 * 工具事件 - 单页
                 * @param pageOptions 单页选项
                 * @param obj 表格对象
                 */
                function headToolbarPageEvent(pageOptions, obj) {
                    // Request Params
                    var requestParams = pageOptions.params || [];
                    // URL
                    var url = pageOptions.route;
                    // target
                    var target = pageOptions.target;
                    // 是否必须选择checkbox
                    var mustSelectCheckbox = !!pageOptions.__mustSelectCheckbox;
                    // 处理后的请求参数
                    var params;

                    // 请参数不为空
                    if (ym2.keys(requestParams).length) {
                        if (mustSelectCheckbox) {
                            // 选中的数据, 多维JSON
                            var data = table.checkStatus(tableOptions.id).data;
                            if (!data.length) {
                                topToastr.warning("请选择数据列!");
                                return;
                            }

                            // URL参数
                            params = ym2.fillParamsMany(requestParams || [], data);
                        } else {
                            params = requestParams;
                        }

                        // href
                        url = ym2.addUrlQueryParam(url, params);
                    }

                    // URl携带筛选条件
                    if (pageOptions.urlAttachFilter) {
                        url = urlBindWhereParams(obj.config, url);
                    }

                    // 打开
                    global.open(url, target);
                }

                /**
                 * 工具事件 - 模态框
                 * @param modalOptions 模态框选项
                 * @param obj 表格对象
                 */
                function headToolbarModalEvent(modalOptions, obj) {
                    // Request Params
                    var requestParams = modalOptions.params || [];
                    // URL
                    var url = modalOptions.route;
                    // modal width
                    var width = modalOptions.width;
                    // modal height
                    var height = modalOptions.height;
                    // modal footer close btn
                    var footerCloseBtn = modalOptions.closeBtn;
                    // layer screen obj
                    var layerScreenObj = ym2.layerScreenOptions(width);
                    // 是否必须选择checkbox
                    var mustSelectCheckbox = !!modalOptions.__mustSelectCheckbox;
                    // 处理后的请求参数
                    var params;

                    // 请参数不为空
                    if (ym2.keys(requestParams).length) {
                        if (mustSelectCheckbox) {
                            // 选中的数据, 多维JSON
                            var data = table.checkStatus(tableOptions.id).data;
                            if (!data.length) {
                                topToastr.warning("请选择数据列!");
                                return;
                            }

                            // URL参数
                            params = ym2.fillParamsMany(requestParams || [], data);
                        } else {
                            params = requestParams;
                        }

                        // href
                        url = ym2.addUrlQueryParam(url, params);
                    }

                    // URl携带筛选条件
                    if (modalOptions.urlAttachFilter) {
                        url = urlBindWhereParams(obj.config, url);
                    }

                    var refererName = ym2.layerRefererWindowName( modalOptions.refererWindow );
                    // layer动态唯一索引
                    var activeIndex = topLayer.index;
                    // iframe 模态框
                    // var loadingFlag = topYmSpinner.show("加载中...");
                    var layerCf = {
                        type: 2, // iframe
                        //skin: 'layui-layer-win10',
                        area: [layerScreenObj.width, height],
                        title: modalOptions.modalTitle,
                        shade: 0.3, // 遮罩透明度
                        shadeClose: false, // 点击遮罩区域，关闭弹层
                        closeBtn: modalOptions.titleCloseBtn,
                        maxmin: modalOptions.titleMaxminBtn, // 允许全屏最小化
                        anim: 0, // 0-6 的动画形式，-1 不开启
                        scrollbar: false, // 打开弹层时，是否允许浏览器出现滚动条。
                        content: url,
                        success: function(layero, index, that){
                            // topYmSpinner.hide( loadingFlag );
                            // 弹层的最外层元素的 jQuery 对象
                            //console.log(layero);
                            // 弹层的索引值
                            //console.log(index);
                            // 弹层内部原型链中的 this --- 2.8+
                            //console.log(that);
                            // 获取iframe的窗口对象, 添加来源追踪
                            var iframeWin = top[layero.find("iframe")[0]["name"]];
                            iframeWin.__REFERER_WIN_NAME = refererName;
                            //键盘事件关闭
                            topJquery(".ym2_kc_" + activeIndex).focus().on("keydown", function (e) {
                                // 空格和回车键
                                if (e.keyCode === 13 || e.keyCode === 32) {
                                    topJquery(this).trigger("click");
                                }
                            });
                        },
                    };
                    if (footerCloseBtn) {
                        layerCf.btn = ['<span class="ym2_keydown_close ym2_kc_' + activeIndex + '" tabindex="0">关闭</span>'];
                    }

                    topLayer.open(layerCf);
                }

                /**
                 * 工具事件 - AJAX
                 * @param ajaxOptions ajax选项
                 * @param obj 表格对象
                 */
                function headToolbarAjaxEvent(ajaxOptions, obj) {
                    // Request Params
                    var requestParams = ajaxOptions.params || [];
                    // URL参数
                    var params = {};
                    // 是否必须选择checkbox
                    var mustSelectCheckbox = !!ajaxOptions.__mustSelectCheckbox;

                    // 请参数不为空
                    if (ym2.keys(requestParams).length) {
                        if (mustSelectCheckbox) {
                            // 选中的数据, 多维JSON
                            var data = table.checkStatus(tableOptions.id).data;
                            if (!data.length) {
                                topToastr.warning("请选择数据列!");
                                return;
                            }

                            // URL参数
                            params = ym2.fillParamsMany(requestParams || [], data);
                        } else {
                            params = requestParams;
                        }
                    }

                    ym2.swal.question(topSwal, ajaxOptions.questionTitle, ajaxOptions.questionDescription, function (result) {
                        /* Read more about isConfirmed, isDenied below */
                        if (result.isConfirmed) {
                            // 发起ajax
                            headToolbarAjaxRequest(ajaxOptions, params, obj);
                        }
                    });
                }

                /**
                 * 工具事件AJAX - 发起请求
                 * @param ajaxOptions ajax选项
                 * @param params 请求参数
                 * @param obj 表格对象
                 */
                function headToolbarAjaxRequest(ajaxOptions, params, obj) {
                    // URL
                    var url = ajaxOptions.route;
                    // HTTP method
                    var method = ajaxOptions.method;

                    // 添加URL参数
                    url = ym2.addUrlQueryParam(url, params);
                    if (ajaxOptions.urlAttachFilter) {
                        url = urlBindWhereParams(obj.config, url);
                    }

                    var instance;
                    if (method.toUpperCase() === "GET") {
                        instance = $http.get(url);
                    } else if (method.toUpperCase() === "POST") {
                        instance = $http.post(url, params);
                    }

                    // show loading
                    var flag = ymSpinner.show();
                    instance.then(function (result) {
                        ymSpinner.hide(flag);

                        var data = result.data;
                        switch (data.code) {
                            case HTTP_SUCCESS_CODE:
                                ym2.swal.ok(topSwal, data.msg);
                                // reload list
                                $timeout(function () {
                                    reloadTable();
                                }, 150);

                                break;
                            case HTTP_FAILURE_CODE:
                                ym2.swal.fail(topSwal, data.msg);

                                break;
                            case HTTP_UNAUTHORITY_CODE:
                                dialog_dump_login_page(data.msg);

                                break;
                            default:
                                ym2.swal.fail(topSwal, data.msg);
                        }

                    }, function (error) {
                        ymSpinner.hide(flag);
                        ym2.swal.fail(topSwal, error.data || "系统错误, 发起请求失败!");
                        global.console.error(error);
                    });

                }

                /**
                 * 工具事件 - Dropdown
                 * @param configs dropdown配置
                 * @param obj 表格配置对象
                 * @param ele 当前DOM对象
                 */
                function headToolbarDropdownEvent(configs, obj, ele) {
                    var btnPos = configs.position;
                    var dataOptions = configs.options.items;
                    // 当前下拉菜单数据不为空时。
                    if (dataOptions.length) {
                        dropdown.render({
                            elem: ele, // 触发事件的 DOM 对象
                            trigger: "click",
                            show: true,  // 外部事件触发即显示
                            data: dataOptions,
                            templet: `
                                <div class="{{= d.uiClass }}">
                                    {{# if (d.icon.length > 0) { }}
                                    <i class="pr-1 {{= d.icon }}"></i>
                                    {{# } }}
                                    <span>{{= d.title }}</span>
                                </div>
                            `,
                            click: function(data){
                                switch (data.options.type) {
                                    case "page": // 单页
                                        headToolbarPageEvent(data.options, obj);
                                        break;
                                    case "modal": // 模态框
                                        headToolbarModalEvent(data.options, obj);
                                        break;
                                    case "ajax": // AJAX
                                        headToolbarAjaxEvent(data.options, obj);
                                        break;
                                }
                            },
                            align: btnPos === "right" ? "right" : "left", // 左、右对齐弹出
                            style: "box-shadow: 1px 1px 10px rgb(0 0 0 / 12%);", // 设置额外样式
                        });
                    } else { // 暂无菜单提示
                        topToastr.info("暂无菜单项。");
                    }
                }

                /**
                 * URL追加表格筛选参数
                 * @param {object} instConfig
                 * @param {string} url
                 * @returns {*}
                 */
                function urlBindWhereParams(instConfig, url) {
                    instConfig = table.getOptions(tableOptions.id);
                    var additionParams = {};
                    if (instConfig.page) {
                        additionParams[instConfig.request.pageName] = instConfig.page.curr;
                        additionParams[instConfig.request.limitName] = instConfig.page.limit;
                    }

                    return ym2.addUrlQueryParam(url, lodash.merge(additionParams, instConfig.where || {}));
                }

                /*** ======================================== 表格筛选 ======================================== ***/
                // 初始化表格筛选表单
                $scope.ym2FilterForm = {};
                $scope.initFilterForm = function () {
<?php if (!empty($toolbarFilter)): ?>
<?php foreach ($toolbarFilter['columns'] as $field => $columns): ?>
<?php switch ($columns['control']): case 'datetime'://日期：Y-m-d H:i:s ?>
<?php case 'date'://日期：Y-m-d ?>
<?php case 'year'://年 ?>
<?php case 'month'://月 ?>
<?php case 'time'://时间 ?>
<?php case 'number'://数字 ?>
<?php case 'text'://文本 ?>
<?php case 'select'://select2下拉框 ?>
<?php case 'radio': //单选框 ?>
<?php case 'select_layui': //layui下拉框 ?>
                    $scope.ym2FilterForm["<?= $field ?>"] = "<?= $columns['default'] ?>";
<?php break; case 'select_link'://多级下拉联动 ?>
                    $scope.ym2FilterForm["<?= $field ?>"] = lodash.trim("<?= $columns['default'] ?>");
                    $scope["<?= $field . '__options' ?>"] = <?= Json::encode($columns['options']) ?>;
<?php break; case 'checkbox'://多选 ?>
                    $scope.ym2FilterForm["<?= $field ?>"] = <?= !empty($columns['default']) ? Json::encode($columns['default']) : '{}' ?>;
<?php break;endswitch; ?>
<?php endforeach; ?>
<?php endif; ?>
                };

                //获取表格筛选表单
                $scope.getFilterForm = function () {
                    var result = lodash.cloneDeep( $scope.ym2FilterForm );

<?php if (!empty($toolbarFilter)): ?>
<?php foreach ($toolbarFilter['columns'] as $field => $columns): ?>
<?php switch ($columns['control']): ?>
<?php case 'checkbox'://多选 ?>
                    result["<?= $field ?>"] = ym2.filterCheckboxValue( result["<?= $field ?>"] );
<?php break;endswitch; ?>
<?php endforeach; ?>
<?php endif; ?>
                    return result;
                };

                // 多级下拉联动 - 发起请求
                $scope.selectLinkRequest = function (currentField, targetField, url) {
                    var queryParams = {};
                    var currentValue = $scope.ym2FilterForm[currentField];

                    // 空值处理
                    if (!currentValue || !lodash.trim(currentValue)) {
                        // 初始化目标连接的值
                        $scope.ym2FilterForm[targetField] = " ";
                        // 初始化目标连接选项
                        $scope[targetField + '__options'] = [];
                        return;
                    }

                    queryParams[currentField] = currentValue;
                    // show loading
                    var flag = ymSpinner.show();
                    $http.get(ym2.addUrlQueryParam(url, queryParams)).then(function (result) {
                        ymSpinner.hide(flag);

                        var data = result.data;
                        switch (data.code) {
                            case HTTP_SUCCESS_CODE:
                                // 初始化目标连接的值
                                $scope.ym2FilterForm[targetField] = " ";
                                // 设置目标连接选项
                                $scope[targetField + '__options'] = data.data || [];

                                break;
                            case HTTP_FAILURE_CODE:
                                topToastr.error(data.msg);

                                break;
                            case HTTP_UNAUTHORITY_CODE:
                                dialog_dump_login_page(data.msg);

                                break;
                            default:
                                topToastr.error(data.msg);
                        }

                    }, function (error) {
                        ymSpinner.hide(flag);
                        topToastr.error(error.data || "系统错误, 发起请求失败!");
                        global.console.error(error);
                    });
                };

                // 重置筛选项
                $scope.resetFilter = function () {
                    $scope.initFilterForm();
                    // 重载表格
                    reloadTable(
                        $scope.getFilterForm(),
                        true
                    );
                };

                /**
                 * 提交筛选
                 */
                $scope.submitFilter = function () {
                    // 重载表格
                    reloadTable(
                        $scope.getFilterForm(),
                        true
                    );
                };
                // 设置工具选项卡筛选
                $scope.triggerTab = function (where) {
                    fixedWhere_toolbar_tag = where;
                    reloadTable(false, true);
                };

                // 筛选项折叠/展开
                $scope[tableFilterDisplayScopeProp] = true;
                $scope.toggleFilterControlDisplayStatus = function (status) {
                    $scope[tableFilterDisplayScopeProp] = status;
                };

                //*********************************************** 其他部分 *********************************************
                //编译HTML字符串
                $scope.$compileHtml = function (v) {
                    // 参数值显式转为字符串类型
                    v = String(v);
                    var htmlTokenCount = 0;
                    try {
                        // 参数值为Text时，jQuery不解析。
                        htmlTokenCount = jQuery( v ).length;
                    } catch (e) {
                        console.log('html解析失败判断为text：' + v);
                    }
                    return htmlTokenCount > 0 ? $compile( v )( $scope ) : v;
                };

                //额外的JS脚本
                <?= !empty($extraJs) ? implode("\n", $extraJs) : '' ?>

                // 初始化筛选表单
                $scope.initFilterForm();

<?php if ($autoRequest): //是否自动加载数据 ?>
                // 表格渲染
                historyWhere = Object.assign( {} , tableOptions.where || {}, $scope.getFilterForm() );
                tableOptions.where = Object.assign( {}, historyWhere, fixedWhere_toolbar_tag );
                table.render(tableOptions);
<?php else: ?>

                var tableInstance;
                global.ym2BehaviorReqExport["<?= $id ?>"] = function (where) {
                    fixedWhere = where || {};
                    if (tableInstance) {
                        // 表格重载
                        Object.keys(fixedWhere).length && reloadTable(false, true);
                    } else {
                        // 表格渲染
                        historyWhere = Object.assign( {}, tableOptions.where || {}, $scope.getFilterForm() );
                        tableOptions.where = Object.assign( {}, historyWhere , fixedWhere, fixedWhere_toolbar_tag);
                        tableInstance = table.render(tableOptions);
                    }
                };
<?php endif; ?>

                //暴露页面数据更新回调，用于组件交互。
                global.ym2CbkExport["<?= $id ?>"] = reloadTable;

                //暴露表格已选数据，用于组件交互。
                global.ym2PageDataExport["<?= $id ?>"] = function () {
                    return table.checkStatus(tableOptions.id);
                };


            }]);

    }(window, top);
</script>
